package cn.exempale.mscapplication.model.net.service;

import java.util.Map;

import cn.exempale.mscapplication.vo.BasicResultVO;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import retrofit2.Call;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;
import retrofit2.http.PartMap;
import retrofit2.http.QueryMap;

public interface ApiService {

    /**
     * 首先调用预处理接口，上传待转写音频文件的基本信息（文件名、大小）和分片信息
     * （建议分片大小设置为10M，若无需分片，slice_num=1）和相关的可配置参数。
     * 调用成功，返回任务ID（task_id，转写任务的唯一标识），是后续接口的必传参数。
     *
     * @param prepareDTO
     * @return
     */
    @FormUrlEncoded
    @POST("prepare")
    Call<BasicResultVO> prepareUpload(@FieldMap Map<String, String> prepareDTO);

    /**
     * 预处理成功，调用文件上传接口；
     * 按预处理设置的分片信息（slice_num）依次上传音频切片（文件以二进制方式读取上传），
     * 直到全部切片上传成功
     * （如预处理时 slice_num=2，则需将音频切分成两部分，slice_id=aaaaaaaaaa和aaaaaaaaab，并按顺序调用该接口）；
     * 上一切片成功上传，才可进行下一切片的上传操作。调用过程中若出现异常，可重试若干次。
     *
     * @param uploadDTO
     */
    @Multipart
    @POST("upload")
    Call<BasicResultVO> upload(@PartMap Map<String, RequestBody> uploadDTO, @Part MultipartBody.Part file);

    @Multipart
    @POST("upload")
    Call<BasicResultVO> upload(@Part("app_id") RequestBody appId, @Part("signa") RequestBody sign,
                               @Part("ts") RequestBody ts, @Part("slice_id") RequestBody sliceNum,
                               @Part("task_id") RequestBody taskId, @Part MultipartBody.Part file);

    /**
     * 全部文件切片上传成功后，调用该接口，通知服务端进行文件合并与转写操作。
     * 该接口不会返回转写结果，而是通知服务端将任务列入转写计划。转写的结果通过 getResult 接口获取。
     *
     * @param taskDTO
     * @return
     */
    @POST("merge")
    Call<BasicResultVO> merge(@QueryMap Map<String, String> taskDTO);

    /**
     * 在调用方发出合并文件请求后，服务端已将任务列入计划。在获取结果前，调用方需轮询该接口查询任务当前状态。
     * 当且仅当任务状态=9（转写结果上传完成），才可调用获取结果接口获取转写结果。
     * 轮询策略由调用方决定，建议每隔10分钟轮询一次。
     *
     * @param taskDTO
     */
    @POST("getProgress")
    Call<BasicResultVO> getProgress(@QueryMap Map<String, String> taskDTO);

    /**
     * 当任务处理进度状态=9（见查询处理进度接口），调用该接口获取转写结果。这是转写流程的最后一步。
     * 服务端也支持主动回调，转写完成之后主动发送转写结果到用户配置的回调地址，配置回调地址请联系技术支持。
     * 结果保存30天，获取次数不超过100次。
     *
     * @param taskDTO taskDTO
     * @return
     */
    @POST("getResult")
    Call<BasicResultVO> getResult(@QueryMap Map<String, String> taskDTO);

}
